package com.example.servlet.config;

import com.example.servlet.vo.UserVO;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestClient;

import static org.springframework.http.MediaType.APPLICATION_JSON;

@Configuration
public class ServletConfig {

    // RestClient 是一个同步 HTTP 客户端，提供现代、流畅的应用程序接口。不推荐使用 RestTemplate，因为它是一个简单的模板方法 API
    // 参考官方文档 https://docs.springjava.cn/spring-framework/reference/integration/rest-clients.html#rest-restclient
    // Spring 官方推荐从 RestTemplate 迁移到 RestClient 。参考 https://docs.springjava.cn/spring-framework/reference/integration/rest-clients.html#_migrating_from_resttemplate_to_restclient
    @Bean
    public RestClient restClient() {
        // 可以定制化 RestClient 的配置
        return RestClient.builder()
                .build();
    }

    // 使用 RestClient 发送 Get 请求
    public String getRestUrl(RestClient restClient, Long id) {
        // 设置 GET 请求
        UserVO userVO = restClient.get()
                // 指定要连接的 URL
                .uri("https://petclinic.example.com/pets/{id}", id)
                // 将 Accept 标头设置为 application/json 意味着响应将使用 Jackson 库将 JSON 转换为对象
                .accept(APPLICATION_JSON)
                // 检索响应
                .retrieve()
                // 将响应体映射为 UserVO 对象
                .body(UserVO.class);
                // .body(String.class); 将响应转换为字符串
        return "Hello World!";
    }

    public String getRestUrl(RestClient restClient) {
        // 设置 GET 请求
        ResponseEntity<String> result = restClient.get()
                // 指定要连接的 URL
                .uri("https://petclinic.example.com/pets/1")
                // 将 Accept 标头设置为 application/json 意味着响应将作为 JSON 映射到字符串
                .accept(APPLICATION_JSON)
                // 检索响应
                .retrieve()
                // 将响应转换为 ResponseEntity
                .toEntity(String.class);

        System.out.println("Response status: " + result.getStatusCode());
        System.out.println("Response headers: " + result.getHeaders());
        System.out.println("Contents: " + result.getBody());
        return "Hello World!";
    }


    // 使用 RestClient 发送 Post 请求
    public String postRestUrl(RestClient restClient, Long id) {
        UserVO userVO = new UserVO("John", "Doe");
        ResponseEntity<Void> response = restClient.post()
                .uri("https://petclinic.example.com/pets/new")
                // 将 Content-Type 标头设置为 application/json 意味着请求将使用 Jackson 库将 UserVO 对象转换为 JSON
                .contentType(APPLICATION_JSON)
                .body(userVO)
                .retrieve()
                .toBodilessEntity();
        return "Hello World!";
    }

}

// RestClient 详细配置参考 https://docs.springjava.cn/spring-framework/reference/web/webmvc-client.html